// 路由鉴权：项目当中路由能不能被访问的权限
import router from '@/router'
import nprogress from 'nprogress'

// 引入进度条进度
import 'nprogress/nprogress.css'
import setting from './setting'
import useUserStore from './store/modules/user'
// 进度条的加载圆圈必要
nprogress.configure({ showSpinner: false })
//为什么引入pinia  之前在app中是不需要导入pinia的，是因为我们这次的文件时写在和main.ts同级的下面，所以我们使用的时候是没有pinia的。而之前使用时app已经使用了pinia了，所以我们不需要导入pina。
import pinia from './store'
const userStore = useUserStore(pinia)
function isJwtExpired(token: any) {
  const base64Url = token.split('.')[1]
  const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/')
  const payload = JSON.parse(atob(base64))

  const expirationTime = payload.exp * 1000 // 将过期时间转换为毫秒

  // 获取当前时间的时间戳
  const currentTime = new Date().getTime()

  // 判断当前时间是否大于过期时间
  if (currentTime > expirationTime) {
    return true // JWT已过期
  } else {
    return false // JWT未过期
  }
}
// 全局前置守卫
router.beforeEach(async (to: any, _from: any, next: any) => {
  //网页标题
  document.title = `${setting.title}-${to.meta.title}`
  // 访问某一个路由之前的守卫
  nprogress.start()
  // 获取token，去判断用户登录还是未登录
  const token = userStore.token

  // 获取用户名字
  const username = userStore.username
  // 用户登录判断
  if (token && !isJwtExpired(token)) {
    // 登录成功，访问login，指向首页
    if (to.path == '/login') {
      next({ path: '/' })
    } else {
      // 登录成功访问其余的路由，放行
      // 有用户信息
      if (username) {
        // 放行
        next()
      } else {
        // 如果没有用户信息，在守卫这里发送请求获取到用户信息在放行
        try {
          // 获取用户信息
          await userStore.userInfo()
          //万一:刷新的时候是异步路由,有可能获取到用户信息、异步路由还没有加载完毕,出现空白的效果
          next({ ...to })
        } catch (error) {
          // token过期|用户手动处理token
          // 退出登录→用户相关数据清空
          await userStore.userLogout()
          next({ path: '/login', query: { redirect: to.path } })
        }
      }
    }
  } else {
    // 用户未登录
    if (to.path == '/login') {
      next()
    } else {
      next({ path: '/login', query: { redirect: to.path } })
    }
  }
  next()
})

// 全局后置守卫
router.afterEach(() => {
  nprogress.done()
})
